/**
 * @file         bsc_netlink_comp.h
 * @brief        NetLink组件
 * @note         对外公布
 * @author       Jpz(jinpuzhao@hopechart.com, 靳普诏)
 * @data         2022-9-6
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2022-9-6    <td>1.0                   <td>Jpz             <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */


#ifndef _BSC_NETLINK_COMP_H_
#define _BSC_NETLINK_COMP_H_

#include "ofc/ofc_types.h"
#include "ofc/ofc_ring_buf.h"
#include "mfc/mfc_serial_vir_bus.h"


#ifdef __cplusplus
extern "C" {
#endif

/// SSL 认证模式
typedef enum TBsNetlinkSslAuthModeTag TBsNetlinkSslAuthMode;
enum TBsNetlinkSslAuthModeTag
{
    kBsNetlinkSslAuthModeNull = 0,          ///< 服务器不要求校验客户端时,该模式表示客户端不校验服务器
    
    kBsNetlinkSslAuthModeServer = 1,        ///< 服务器不要求校验客户端时,该模式表示客户端校验服务器
    
    kBsNetlinkSslAuthModeClientServer = 2,  ///< 服务器不要求校验客户端时,该模式等同于kBsNetlinkSslAuthModeServer
                                            ///< 服务器要求校验客户端时,必须设置为该模式
}; 

/**
 * 连接模式
 */
typedef enum TBsNetlinkCompModeTag TBsNetlinkCompMode;
enum TBsNetlinkCompModeTag
{
    kBsNetlinkCompNormal    = 0,
    kBsNetlinkCompModeSync      = kBsNetlinkCompNormal, ///< 同步创建连接
    kBsNetlinkCompModeAsync     = 1,                    ///< 异步创建连接
    kBsNetlinkCompModeMax,
};

typedef struct TBsNetlinkCompAttrTag TBsNetlinkCompAttr;
struct TBsNetlinkCompAttrTag
{
    Int8 modem_id;                  ///< 联网模块id, 参考(@ref TBsNetlinkConst)[@file bsc_netlink_enum.h]
    UInt8 mode;                     ///< 连接同步/异常方式
    UInt8 *rx_buf;                  ///< 接收缓存
    Int32 rx_buf_size;              ///< 接收缓存大小
    const char *apn_name;           ///< APN名称 NULL: 使用默认APN
    const char *apn_user;           ///< APN用户名
    const char *apn_password;       ///< APN密码
    const char *dns_addr1;          ///< 主DNS地址  相同的APN链路共用DNS地址
    const char *dns_addr2;          ///< 备DNS地址  相同的APN链路共用DNS地址(主DNS不为空) 

    Bool  ssl_enabled;              ///< 是否SSL
    Bool  ssl_is_on_sni;            ///< 是否开启服务器名称指示功能
    // UInt8 ssl_version;              ///< SSL版本号. 建议值: 4                // <2024-09-27> Jpz todo : 增加后无法向前兼容
    UInt8 ssl_auth_mode;            ///< 认证模式,见TBsNetlinkSslAuthMode。
    Bool  ssl_ignore_cert_timeout;  ///< 忽略证书过期
    // UInt8 ssl_ignore_items;         ///< 忽略证书项目. 建议值: 1
    // UInt16 ssl_cipher_suite;        ///< 密钥套件. 建议值: 0xffff
    // UInt16 ssl_negoti_time;         ///< 握手超时时间(秒) 建议值: 300
    const char *ssl_ca_cert_path;   ///< CA证书路径
    const char *ssl_clt_cert_path;  ///< 客户端证书路径
    const char *ssl_clt_key_path;   ///< 客户端私钥路径

};

typedef struct TBsNetlinkCompTag TBsNetlinkComp;
struct TBsNetlinkCompTag
{
PROTECTED
    TMfSerialVirBus parent_;    ///< 虚拟总线

PRIVATE
    Int32  client_;             ///< client handle
    Int32  line_id_;            ///< line ID
    TOfRingBuf rx_ring_buf_;    ///< 接收缓冲
    Bool   is_async_mode_;      ///< 是否异步连接
    Bool   connect_pending_;    ///< 连接中    
    // Bool   is_connected_;       ///< 是否已经连接。 直接引用TMfSerialVirBusConnected方法
    UInt8  modem_id_;
    UInt32 async_connect_timeout_;
    TBsNetlinkCompAttr netlink_attr_; ///< netlink属性
}; 


/**
 * socket构造
 * @param self:         组件对象
 * @param modem_id:     联网模块id, 参考(@ref TBsNetlinkConst)[@file bsc_netlink_enum.h]
 * @param mode:         连接同步/异常方式
 * @param rx_buf:       接收缓存
 * @param rx_buf_size:  接收缓存大小
 * @return 
 */
Int32 TBsNetlinkCompCreate(TBsNetlinkComp *self, Int8 modem_id, UInt8 mode, UInt8 *rx_buf, Int32 rx_buf_size);

/**
 * socket构造
 * @param self:         组件对象
 * @param attr:         属性
 * @return 
 */
Int32 TBsNetlinkCompCreateEx(TBsNetlinkComp *self, const TBsNetlinkCompAttr *attr);

/**
 * socket析构
 * @param self: 组件对象
 * @return
 */
void TBsNetlinkCompDestroy(TBsNetlinkComp *self);

/**
 * 未应答字节数量
 * @param self: 组件对象
 * @return
 */
Int32 TBsNetlinkCompUnAckBytes(TBsNetlinkComp *self);

/**
 * 总发送字节数
 * @param self: 组件对象
 * @return
 */
Int32 TBsNetlinkCompTotalSendBytes(TBsNetlinkComp *self);

/**
 * 总接收字节数
 * @param self: 组件对象
 * @return
 */
Int32 TBsNetlinkCompTotalRecvBytes(TBsNetlinkComp *self);

/**
 * 获取socket virbus接口
 * @param self: 组件对象
 * @return virbus接口
 */
TMfSerialVirBus *TBsNetlinkCompInterface(TBsNetlinkComp *self);

/**
 * 设置socket的异步连接超时时间，内部默认30000毫秒,单位ms
 * @note 内部限制最小5秒，最长300秒
 * @param self: 组件对象
 * @param timeout: 超时时间，单位:ms
 * @return virbus接口
 */
void TBsNetlinkCompSetAsyncConnectTimeout(TBsNetlinkComp *self, UInt32 timeout);

#ifdef __cplusplus
}  //extern "C" {
#endif


#endif


